package com.joker.demo.core.domain.enums;

/**
 * 任务状态枚举
 * 用于表示任务的整体状态，主要反映任务是否有可用的执行器
 *
 * @author : feixiang.li
 * @since : 2025-07-23 21:18
 */
public enum JobStatusEnum {

    /**
     * 就绪状态
     * 表示任务有可用的执行器，可以正常执行
     */
    READY(1, "就绪"),

    /**
     * 异常状态
     * 表示任务没有可用的执行器，无法正常执行
     */
    EXCEPTION(2, "异常"),

    /**
     * 停止状态
     * 表示任务被手动停止，暂停执行
     */
    STOP(3, "停止"),

    /**
     * 暂停状态
     * 表示任务被暂停，暂时不执行
     */
    PAUSED(4, "暂停"),

    /**
     * 禁用状态
     * 表示任务被禁用，不参与调度
     */
    DISABLED(5, "禁用"),

    /**
     * 维护状态
     * 表示任务处于维护中，暂时不可用
     */
    MAINTENANCE(6, "维护中");

    private final Integer code;
    private final String desc;

    JobStatusEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 根据状态码获取枚举值
     *
     * @param code 状态码
     * @return 对应的枚举值，如果不存在则返回null
     */
    public static JobStatusEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (JobStatusEnum value : JobStatusEnum.values()) {
            if (value.code.equals(code)) {
                return value;
            }
        }
        return null;
    }

    /**
     * 根据描述获取枚举值
     *
     * @param desc 状态描述
     * @return 对应的枚举值，如果不存在则返回null
     */
    public static JobStatusEnum getByDesc(String desc) {
        if (desc == null) {
            return null;
        }
        for (JobStatusEnum value : JobStatusEnum.values()) {
            if (value.desc.equals(desc)) {
                return value;
            }
        }
        return null;
    }

    /**
     * 检查是否为可执行状态
     * 只有READY状态的任务才能正常执行
     *
     * @return true表示可以执行，false表示不能执行
     */
    public boolean isExecutable() {
        return this == READY;
    }

    /**
     * 检查是否为异常状态
     * EXCEPTION状态表示任务无法正常执行
     *
     * @return true表示异常状态，false表示正常状态
     */
    public boolean isException() {
        return this == EXCEPTION;
    }

    /**
     * 检查是否为停止状态
     * STOP、PAUSED、DISABLED、MAINTENANCE都属于停止状态
     *
     * @return true表示停止状态，false表示运行状态
     */
    public boolean isStopped() {
        return this == STOP || this == PAUSED || this == DISABLED || this == MAINTENANCE;
    }

    /**
     * 检查是否为活跃状态
     * READY和EXCEPTION都属于活跃状态（参与调度）
     *
     * @return true表示活跃状态，false表示非活跃状态
     */
    public boolean isActive() {
        return this == READY || this == EXCEPTION;
    }

    @Override
    public String toString() {
        return String.format("JobStatusEnum{code=%d, desc='%s'}", code, desc);
    }
}
